package com.spmsys.mapper;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.function.Function;

/**
 * 数据库接口
 */
public interface Database {

    /**
     * 运行事务接口
     *
     * @param func 函数
     * @return 处理结果
     */
    public Object runTransaction(Function<Connection, Object> func);

    /**
     * 新增记录接口
     *
     * @param tableName 表名
     * @param record    记录
     * @return 数据标识
     */
    public String dbCreate(String tableName, JSONObject record);

    /**
     * 批量新增记录接口
     *
     * @param tableName 表名
     * @param records   记录
     * @return 数据标识列表
     */
    public JSONArray dbBatchCreate(String tableName, JSONArray records);

    /**
     * 删除记录接口
     *
     * @param tableName 表名
     * @param id       数据标识
     * @return 删除文档数量
     */
    public Integer dbDelete(String tableName, String id);

    /**
     * 批量删除记录接口
     *
     * @param tableName 表名
     * @param where     查询条件
     * @return 删除文档数量
     */
    public Integer dbBatchDelete(String tableName, JSONArray where);

    /**
     * 更新记录接口
     *
     * @param tableName 表名
     * @param id       数据标识
     * @param record    记录
     * @return 更新文档数量
     */
    public Integer dbUpdate(String tableName, String id, JSONObject record);

    /**
     * 批量更新记录接口
     *
     * @param tableName 表名
     * @param where     查询条件
     * @param record    记录
     * @return 更新文档数量
     */
    public Integer dbBatchUpdate(String tableName, JSONArray where, JSONObject record);

    /**
     * 查询记录接口
     *
     * @param tableName 表名
     * @param id       数据标识
     * @return 记录
     */
    public JSONObject dbGetItem(String tableName, String id);

    /**
     * 查询记录列表接口
     *
     * @param tableName 表名
     * @param pageNo    页码（1开始）
     * @param pageSize  每页大小
     * @param orderBy   排序字段
     * @param orderType 排序方式（asc：升序 desc：降序）
     * @param where     查询条件
     * @return 总数 页码 每页大小 记录列表
     */
    public JSONObject dbGetRecords(String tableName, Integer pageNo, Integer pageSize, String orderBy, String orderType, JSONArray where);
}
